package main

import (
	"fmt"
	workpool "gitee.com/Cookie_XiaoD/go-worker-pool"
	"log"
	"math/rand"
	"os"
	"os/signal"
	"runtime"
	"syscall"
	"time"
)

func main() {
	d, err := workpool.NewDispatcher(workpool.MaxJobs(1000), workpool.MaxWorkers(10))
	if err != nil {
		log.Fatal(err)
	}
	if err = d.Run(); err != nil {
		log.Fatal(err)
	}
	/*
		比如50个任务，10个worker，每个任务固定耗时2秒，则大概需要10秒可以完成50个任务（取决于配置）
		若每个任务耗时0到2秒，则当任务结束时worker可以立马执行下一个任务，总耗时低于10秒
	*/
	for i := 0; i < 50; i++ {
		jobID := i + 1
		job := &TestJob{Id: fmt.Sprintf("任务%v", jobID)}
		d.HandleJob(job)
		log.Println("有任务需要执行", job, "当前协程数量：", runtime.NumGoroutine())
	}
	ch := make(chan os.Signal)
	signal.Notify(ch, os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGQUIT)
	<-ch
	fmt.Println("开始stop")
	d.Stop()
	fmt.Println("已经stop")
}

type TestJob struct {
	Id string
}

func (t *TestJob) GetId() string {
	return t.Id
}

func (t *TestJob) Exec() error {
	log.Println("开始执行任务", t.Id)
	duration := time.Duration(rand.Intn(3)) * time.Second
	time.Sleep(duration)
	log.Println("任务执行完毕", t.Id, "耗时：", duration.Seconds(), "秒")
	return nil
}
